Ref: Tianqi Chen and Carlos Guestrin. XGBoost: A Scalable Tree Boosting System. In 22nd SIGKDD Conference on Knowledge Discovery and Data Mining, 2016
B. 설치
XGBoost는 CPU전용 설치와 GPU전용 설치 두개로 나뉜다. CPU 전용으로 설치한다면,
install xgboost``` 를 해버리면 끝이나
1 2 3 4 5 6 7
실제로 사용하려고 하면, Decision Tree보다 느린 속도를 체감하게 되므로 자연스럽게 GPU를 쓰게 된다. GPU 전용으로 설치하려면, 소스로부터 직접 컴파일 해야한다. XGBoost에서는 install guide를 제공해주고 있는데, 현재까지 나온 install guide에는 약간의 문제가 있는데 바로 multi-gpu 관련 문제다. multi-gpu를 사용하기 위해선 GPU간의 communication을 담당해주는 **NCLL**(pronounced "Nickel") 이라는걸 셋팅해줘야하는데 기본 가이드에선 본 셋팅이 빠져있기 때문이다. 설치 가이드: http://xgboost.readthedocs.io/en/latest/build.html#building-with-gpu-support 교정된 내용 출처: https://github.com/dmlc/xgboost/issues/2915
param = { 'max_depth': 4, # the maximum depth of each tree 'eta': 0.3, # the training step for each iteration 'silent': 1, # logging mode - quiet 'objective': 'multi:softprob', # error evaluation for multiclass training 'num_class': 2, # the number of classes that exist in this datset # 'gpu_id': 0, # 특정 GPU를 지정하고 싶을때 쓰는 id 'n_gpus' : 2, # 2개 사용하자 'max_bin': 16, # GPU 'tree_method': 'gpu_hist', # GPU method (자세한 설명은 문서로!) 'predictor':'gpu_predictor' # train뿐만아니라 predict할때도 gpu쓸건지 결정 }
num_round = 35 # the number of training iterations model = xgb.train(param, dtrain, num_round)
CPU vs GPU in XGBoost
# 실험 데이터 45,000 건에 대한 결과
# Before GPU
# CPU times: user 11min 57s, sys: 6min 2s, total: 17min 59s
# Wall time: 8min 10s
# After GPU
# CPU times: user 1min 35s, sys: 8.03 s, total: 1min 43s
# Wall time: 10.1 s
GPU 2대가 잘 돌아간다~
# +-----------------------------------------------------------------------------+
# | NVIDIA-SMI 390.67 Driver Version: 390.67 |
# |-------------------------------+----------------------+----------------------+
# | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
# | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
# |===============================+======================+======================|
# | 0 GeForce GTX 108... Off | 00000000:02:00.0 On | N/A |
# | 37% 54C P2 205W / 250W | 6352MiB / 11177MiB | 75% Default |
# +-------------------------------+----------------------+----------------------+
# | 1 GeForce GTX 108... Off | 00000000:03:00.0 Off | N/A |
# | 32% 45C P2 172W / 250W | 811MiB / 11178MiB | 45% Default |
# +-------------------------------+----------------------+----------------------+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
### XGBoost rank - XGBoost rank도 랭킹 관련해서는 꽤 강력한 알고리즘인거 같은데 공식 홈페이지도 문서화가 너무 잘 안되어있어서 따로 이렇게 정리해두려함
```python # ref: https://www.jianshu.com/p/9caef967ec0a # https://www.slideshare.net/MinsubYim/evaluation-in-ir-system # Dataformat을 보면 # Query 상황에 대해 feedback 하기위한 rank 데이터가 필요함 # Rank는 중복순위는 안되지만 중복되도 어느정도 그 값을 반영함 # Data format # input: (batch, feature_dim) # feature에 벡터뿐 아니라 rank를 넣는건 어떨까? # output: (batch, label) # group은 query당 1개라고 생각하면 될듯 # 데이터 셋을 만드려면, 쿼리당 대응되는 순위가 있어야함 (꼭 순위가 아니면 그냥 1등짜리)
# numpy.random.choice(a, size=None, replace=True, p=None) # 각 그룹마다, [0,1,2,4,5] 중에 5개를 중복없이 뽑아서 넣는다. 그리고 한줄로 핀다 dtarget=np.array([np.random.choice([0,1,2,4,5],5,False) for i inrange(n_group)]) print(dtarget) dtarget = dtarget.flatten() print(dtarget)
[[2 1 4 4 0]
[2 4 2 5 5]]
[2 1 4 4 0 2 4 2 5 5]
1 2 3 4 5 6
# N_group은 표본의 각 그룹이 연속적이면 앞에서 뒤로 각 그룹에 있는 샘플의 수를 나타내는 데 사용됩니다. # [5,5]은 10개의 샘플 중 첫 번째 5 개가 첫 번째 그룹이고 마지막 세 개가 두 번째 그룹임을 의미합니다. dgroup = np.array([n_choice for i inrange(n_group)]) print(dgroup) dgroup = dgroup.flatten() print(dgroup)
[5 5]
[5 5]
1 2 3
# concate Train data, very import here ! xgbTrain = DMatrix(dtrain, label = dtarget) print(xgbTrain)
<xgboost.core.DMatrix object at 0x1a0eecd9e8>
1 2
xgbTrain.set_group(dgroup) print(xgbTrain)
<xgboost.core.DMatrix object at 0x1a0eecd9e8>
1 2 3 4 5
# generate eval data dtrain_eval=np.random.uniform(0,100,[n_group*n_choice,feature_dim]) xgbTrain_eval = DMatrix(dtrain_eval, label = dtarget) xgbTrain_eval.set_group(dgroup) evallist = [(xgbTrain,'train'),(xgbTrain_eval, 'eval')] # eval만 있어도 되는듯